package com.wang.spring.container.a_beanfactory;

import com.wang.spring.container.a_beanfactory.bean.Dog;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.ClassPathResource;

import java.util.Arrays;
import java.util.stream.Stream;

public class ListableBeanFactoryApplication {
    public static void main(String[] args) {

        ClassPathResource resource = new ClassPathResource("container/listable-container.xml");
        DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory();
        XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(defaultListableBeanFactory);
        beanDefinitionReader.loadBeanDefinitions(resource);
        // 直接打印容器中的所有Bean
        System.out.println("加载xml文件后容器中的Bean：");
        // 从打印的过程中来看，打印的是xml中定义的 bean的ID，也就是bean的 name ，如果没有定义那么就是
        // spring 自己定义的
        Stream.of(defaultListableBeanFactory.getBeanDefinitionNames()).forEach(System.out::println);

        System.out.println("============");
        System.out.println("手动注册单实例bean");
        defaultListableBeanFactory.registerSingleton("aDog",new Dog());
        // 再打印容器中的所有Bean
        System.out.println("手动注册单实例Bean后容器中的所有Bean：");
        // 加载xml文件后容器中的Bean：
        //com.wang.spring.container.a_beanfactory.bean.Cat#0
        //============
        //手动注册单实例bean
        //手动注册单实例Bean后容器中的所有Bean：
        //com.wang.spring.container.a_beanfactory.bean.Cat#0
        //可以看到打印出来的并没有 手动注册的bean，这是因为 ListableBeanFactory  不会把容器中通过其他方式注入进来的bean
        // 拿出来
        Stream.of(defaultListableBeanFactory.getBeanDefinitionNames()).forEach(System.out::println);

        // 通过其他的方式，也就是 ListableBeanFactory 例外的获取bean的方式，是可以获取到的
        System.out.println("=========通过特定方式获取bean==========");
        System.out.println("容器中真的有注册Dog：" + defaultListableBeanFactory.getBean("aDog"));
        defaultListableBeanFactory.registerSingleton("bDog", new Dog());
        System.out.println("容器中所有的dog：" + Arrays.toString(defaultListableBeanFactory.getBeanNamesForType(Dog.class)));


    }

}
